package wiki.xsx.jdbc;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

/**
 * @Descript 字符串工具类
 * @Author xsx
 * @Date 2017/11/11
 */
public class StringUtil {

    private StringUtil(){}

    /**
     * 根据占位符个数获取对应占位符
     * @param size 占位符个数
     * @return 返回占位符
     */
    public static String getPlaceholder(int size){
        StringBuilder placeholder = new StringBuilder();
        for (int i=0;i<size;i++){
            placeholder.append("?,");
        }
        return placeholder.substring(0, placeholder.length()-1);
    }

    /**
     * 根据参数字符串，获取参数个数
     * @param str 参数字符串
     * @return 返回占位符个数
     */
    public static int getPlaceholderSize(String str){
        return str.split(",").length;
    }

    /**
     * 根据参数字符串获取参数列表
     * @param str 参数字符串,按逗号分隔
     * @return 返回参数列表
     */
    public static <T> List<T> getArgs(String str){
        return Arrays.asList((T[])str.split(","));
    }

    /**
     * 根据参数字符串与分隔符获取参数列表
     * @param str 参数字符串
     * @param pattern 分隔符
     * @return 返回参数列表
     */
    public static <T> List<T> getArgsWithPattern(String str, String pattern){
        return Arrays.asList((T[])str.replaceAll(pattern, "").split(","));
    }

    /**
     * 首字母大写
     * @param str 字符序列
     * @return 返回首字母大写字符串
     */
    public static String upperFirst(CharSequence str) {
        if(str==null) {
            return null;
        } else {
            if(str.length() > 0) {
                char firstChar = str.charAt(0);
                if(Character.isLowerCase(firstChar)) {
                    return Character.toUpperCase(firstChar) + str.subSequence(1, str.length()).toString();
                }
            }
            return str.toString();
        }
    }

    /**
     * 获取字段名称及值
     * @param t
     * @param <T>
     * @return
     */
    public static <T> Map<String, Object> getFieldNameAndValue(T t) {
        Map<String, Object> data = new LinkedHashMap<>();
        if (t==null||t instanceof Class){
            return data;
        }
        Class<? extends Object> entityClass = t.getClass();
        while (entityClass!=null&&!entityClass.getName().equalsIgnoreCase("java.lang.object")){
            Field[] fields = entityClass.getDeclaredFields();
            for (Field field : fields){
                StringBuilder methodName = new StringBuilder("get");
                methodName.append(upperFirst(field.getName()));
                try {
                    Method method = entityClass.getMethod(methodName.toString());
                    data.put(field.getName(), method.invoke(t));
                }catch (NoSuchMethodException|IllegalAccessException|InvocationTargetException e){
                    data.put(field.getName(), null);
                }
            }
            entityClass = entityClass.getSuperclass();
        }
        return data;
    }
}
